import { useTokenStore } from '@/stores/mytoken'
import request from '../utils/request'
import type { UserCommon } from '@/api/types/userType'

// 登录参数类型
type LoginInfo = {
    phone: string,
    password: string,
    code?: string
}

// 登录返回数据类型
type LoginResult = UserCommon<string>

// 用户请求登录
export async function getLogin(loginInfo: LoginInfo) {
    return request<LoginResult>({
        url: '/front/user/login',
        method: 'post',
        data: `phone=${loginInfo.phone}&password=${loginInfo.password}`
    })
}

/*
    要求请求类型 application/x-www-form-urlencoded
    需要把数据拼接为  data: `属性1=值1&属性2=值2` 

    要求请求类型 application / json
    只需要直接传入对象  data: loginInfo
*/


// 用户信息返回类型
type UserInfo = UserCommon<{
    isUpdatedPassword: boolean,
    portrait: string,
    userName: string
}>


// 获取用户信息
export function getUserInfo() {
    return request<UserInfo>({
        url: '/front/user/getInfo',
        method: 'get'
    })
}



// 用户退出登录
export function logout() {
    return request({
        url: '/front/user/logout',
        method: 'post'
    }) 
}



// token过期 刷新token请求
type RefreshTokenResult = UserCommon<string>

// eslint-disable-next-line @typescript-eslint/no-explicit-any
let promiseRT: Promise<any> // 保存请求的promise对象
let isRefreshing = false // 刷新中标志

export function refreshToken() {
    if(isRefreshing) {
        // 有一个刷新请求正在进行
        // 先完成当前的刷新请求
        return promiseRT
    }
    isRefreshing = true
    // 把当前请求返回值保存到promise对象中
    promiseRT = request<RefreshTokenResult>({
        url: '/front/user/refresh_token',
        method: 'post',
        params: {
            refreshtoken: useTokenStore().token?.refresh_token
        }
    }).finally(() => {
        // 请求完成后，刷新结束
        isRefreshing = false
    })
}

/*
    举例来说，假设在一个页面中有两个按钮，按钮 A 和按钮 B，点击它们都会触发需要有效令牌的操作。
    如果令牌过期，点击按钮 A 会先发起刷新令牌的请求，此时 isRefreshing 变为 true，promiseRT 被赋值为这个刷新请求的 Promise 对象。
    接着用户快速点击按钮 B，由于 isRefreshing 已经是 true，按钮 B 不会发起新的刷新请求，而是直接返回按钮 A 发起的刷新请求对应的 promiseRT。
    这样就保证了在同一时间内，只会有一个刷新令牌的请求在执行，避免了重复请求带来的问题。
*/